package org.example.gateway;

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.util.MultiValueMap;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

@Order(-1) //标明处理顺序，否则过滤顺序是未知的
@Component
public class AuthorizeFilter implements GlobalFilter {

    /**
     *处理当前请求，有必要的话通过 GatewayFilterChain 将请求交给下一个过滤器来处理
     * @param exchange 请求上下文，可以获取到 Request、Response 等信息
     * @param chain 用来把请求委托给下一个过滤器
     * @return 表示当前过滤器业务结束
     */
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //1.获取请求参数
        MultiValueMap<String, String> params = exchange.getRequest().getQueryParams();
        //2.获取 authorization 参数
        String auth = params.getFirst("authorization");
        //3.校验(自定义业务逻辑进行校验，这里以校验参数是否一致为例)
        if("cyk".equals(auth)) {
            //放行，交给下一个过滤器
            return chain.filter(exchange);
        }
        //4.拦截反馈(这里禁止访问FORBIDDEN为例，对应状态码 403)
        exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);
        //结束处理
        return exchange.getResponse().setComplete();
    }
}
